package com.dy.design_pattern_study.design_pattern_principles;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-03-13
 * @Content 开放-封闭原则
 * 这种不能修改，但可以扩展的思想也是最重要的一种设计原则，
 * 它就是开放-封闭原则（The Open-Closed Principle，简称OCP）或叫开-闭原则
 * 开放-封闭原则: 是说软件实体（类、模块、函数等等）应该可以扩展，但是不可修改。
 * 一旦设计了对应的实体之后，那么实体便不可以修改，但应该可以扩展
 * <p>
 * 一个是说‘对于扩展是开放的（Open for extension）’，
 * 另一个是说‘对于更改是封闭的（Closed for modification）’
 * ---
 * 上班迟到问题，严格执行上班迟到制度，家远的可能堵车，迟到
 * 规则可以进行变化
 * 上班晚些，打卡晚些 -基本原则不变，但对内容进行扩展
 * ---
 * 无论模块是多么的‘封闭’，都会存在一些无法对之封闭的变化。
 * 既然不可能完全封闭，设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。
 * 他必须先猜测出最有可能发生的变化种类，然后构造抽象来隔离那些变化 --这种也不现实，因为不可能啥都想到
 * <p>
 * 面对需求，对程序的改动是通过增加新代码进行的，而不是更改现有的代码
 * <p>
 * --------开放-封闭原则--------
 * 开放-封闭原则是面向对象设计的核心所在。
 * 遵循这个原则可以带来面向对象技术所声称的巨大好处，也就是可维护、可扩展、可复用、灵活性好。
 * 开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象，然而，
 * 对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。
 * 拒绝不成熟的抽象和抽象本身一样重要
 * <p>
 * ---总结---
 * 开放-封闭原则，实质就是 对未来不确定性的一致扩展，和对已有存在的封闭（不改变）
 * 简单的说，就是在设计一个功能的时候，需要考虑的某些东西是可能会被修改的，这个时候需要进行相应的设计
 * 灵活的变通，但又不能所有的东西都要拿来修改，因此这里需要一定的封闭
 * 把握这两者之间的差距是困难的，还需要在不断的工作中进行总结、积累经验
 */
public class OpenClosedPrinciple {
}
